home *** CD-ROM | disk | FTP | other *** search
/ Whiteline: delta / whiteline CD Series - delta.iso / english / bkit161e / example.c < prev    next >
C/C++ Source or Header  |  1995-11-25  |  4KB  |  175 lines

  1. /*
  2.  * Beispiel-Programm zur Benutzung des Selectric-Protokolls mit BoxKite
  3.  * unter MiNT/MultiTOS
  4.  * (c) Harald Becker, 12.5.1994. Übersetzt mit Pure C und DEFAULT.PRJ.
  5.  *
  6.  * Diesen Code dürfen Sie nach Belieben verwenden und ganz oder in in Auszügen
  7.  * in Ihre Programme aufnehmen.
  8.  */
  9. #include <stdio.h>
  10. #include <aes.h>
  11. #include <tos.h>
  12. #include <string.h>
  13.  
  14.  
  15. /*
  16.  * Diese Struktur wird von BoxKite gefüllt. Sie ist identisch mit der
  17.  * TOS-DTA, sieht jedoch Platz für lange Datenamen vor.
  18.  */
  19. typedef struct
  20. {    char            d_reserved[21];
  21.     unsigned char    d_attrib;
  22.     unsigned int    d_time;
  23.     unsigned int    d_date;
  24.     unsigned long    d_length;
  25.     char            d_fname[34];
  26. } XDTA;
  27.  
  28. /*
  29.  * Die Selectric-Struktur.
  30.  */
  31. typedef struct
  32. {    unsigned long    id;            /* Selectric ID (SLCT)        */
  33.     unsigned int    version;    /* version (BCD-Format)        */
  34.     struct
  35.     {    unsigned           : 7;    /* reserved                     */
  36.         unsigned pthsav    : 1;
  37.         unsigned stdest    : 1;
  38.         unsigned           : 1;
  39.         unsigned numsrt    : 1;   /* numerisches Sortieren     */
  40.         unsigned lower     : 1;
  41.         unsigned dclick    : 1;   /* Ordner mit Doppelklick    */
  42.         unsigned hidden    : 1;   /* versteckte Dateien        */
  43.         unsigned onoff     : 1;   /* Fileselector AN/AUS       */
  44.     } config;
  45.     int    sort;            /* sort-mode (neg. = rev.)    */
  46.     int    num_ext;        /* number of extensions        */
  47.     char *(*ext)[];        /* preset extensions        */
  48.     int    num_paths;        /* number of paths        */
  49.     char *(*paths)[];        /* preset paths            */
  50.     int    comm;            /* communication word        */
  51.     int    in_count;        /* input counter        */
  52.     void *in_ptr;        /* input pointer        */
  53.     int    out_count;        /* output counter        */
  54.     void *out_ptr;        /* output pointer        */
  55.     int    cdecl    (*get_first)(XDTA *dta, int attrib);
  56.     int    cdecl     (*get_next)(XDTA *dta);
  57.     int    cdecl    (*release_dir)(void);
  58. } SLCT_STR;
  59.  
  60. typedef struct
  61. {    long    id;
  62.     long    value;
  63. } COOKIE;
  64.  
  65. long Supexec(long (*codeptr)());
  66.  
  67. long mint_cookie;
  68. SLCT_STR *slct_cookie;
  69. int    cdecl (*p_get_first)(XDTA *dta, int attrib);
  70. int    cdecl (*p_get_next)(XDTA *dta);
  71. int    cdecl (*p_release_dir)(void);
  72.  
  73. /*
  74.  * Gibt die Adresse des Cookie-Jar zurück. Mit Supexec() aufrufen.
  75.  */
  76. long get_cookiejar(void)
  77. {    return *((long *)0x05a0l);
  78. }
  79.  
  80. /*
  81.  * Durchsucht den Cookie Jar nach einem cookie mit gegebener id und
  82.  * liefert dessen Wert zurück.
  83.  */
  84. long get_cookie(long id)
  85. {    long sav;
  86.     COOKIE *cookiejar;
  87.     int    i = 0;
  88.  
  89.     cookiejar = (COOKIE *)Supexec(get_cookiejar);
  90.  
  91.     if ( cookiejar )
  92.     {    while ( cookiejar[i].id )
  93.         {    if ( cookiejar[i].id == id )
  94.                 return cookiejar[i].value;
  95.             i++;
  96.         }
  97.     }
  98.     return 0L;
  99. }
  100.  
  101. /*
  102.  * Prüft, ob am 'FSEL'-cookie ein Selectric-1.02-kompatibler Fileselector hängt.
  103.  * Im Erfolgsfall werden die Zeiger auf die Directory-Routinen ausgelesen und
  104.  * irgendwohin kopiert, wo sie ohne memory protection violation erreichbar sind.
  105.  */
  106. long setup_selector(void)
  107. {    if ( slct_cookie && slct_cookie->id == 'SLCT' && slct_cookie->version >= 0x102 )
  108.     {    slct_cookie->comm = 9;
  109.         p_get_first = slct_cookie->get_first;
  110.         p_get_next = slct_cookie->get_next;
  111.         p_release_dir = slct_cookie->release_dir;
  112.         return 1;
  113.     }
  114.     return 0;
  115. }
  116.  
  117. /*
  118.  * Fragt das aktuelle Laufwerk und den aktuellen Pfad ab.
  119.  */
  120. void getpath(char *p)
  121. {    int drv;
  122.  
  123.     drv = Dgetdrv();
  124.     *p++ = drv + 'A';
  125.     *p++ = ':';
  126.     Dgetpath(p, drv);
  127.     p += strlen(p) - 1;
  128.     if ( *p != '\\' )
  129.     {    p++;
  130.         *p++ = '\\';
  131.         *p = 0;
  132.     }
  133. }
  134.  
  135. int main(void)
  136. {    XDTA mydta;
  137.     char path[130], name[34], outbuf[128];
  138.     int exbtn, rv, d, i;
  139.  
  140.     appl_init();
  141.  
  142.     slct_cookie = (SLCT_STR *)get_cookie('FSEL');
  143.     mint_cookie = get_cookie('MiNT');
  144.  
  145.     if ( !Supexec(setup_selector) )
  146.     {    form_alert(1, "[1][Kein kompatibler Fileselector|installiert.][   Ok   ]");
  147.         appl_exit();
  148.         return 0;
  149.     }
  150.  
  151.     if ( mint_cookie )            /* Damit auch wirklich lange Namen rauskommen */
  152.         Pdomain(1);
  153.  
  154.     getpath(path);
  155.     strcat(path, "*.*");
  156.     *name = 0;
  157.     wind_update(BEG_MCTRL);        /* Wichtig */
  158.     rv = fsel_input(path, name, &exbtn);
  159.     if ( rv && exbtn )
  160.     {    d = p_get_first(&mydta, 0xff);
  161.         i = 1;
  162.         while( !d )
  163.         {    sprintf(outbuf, "[1][Datei Nr %d:|%s %02x][   Ok   ]", i, mydta.d_fname, mydta.d_attrib);
  164.             form_alert(1, outbuf);
  165.             d = p_get_next(&mydta);
  166.             i++;
  167.         }
  168.         p_release_dir();
  169.     }
  170.     wind_update(END_MCTRL);        /* Wichtig */
  171.  
  172.     appl_exit();
  173.     return 0;
  174. }
  175.